package com.itany.shop.service.impl;


import com.itany.shop.dao.UserDao;
import com.itany.shop.entity.User;
import com.itany.shop.exception.*;
import com.itany.shop.factory.ObjectFactory;
import com.itany.shop.service.UserService;
import com.itany.shop.util.MD5Util;
import com.itany.shop.util.ParameterUtil;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class UserServiceImpl implements UserService {

    private UserDao userDao = (UserDao) ObjectFactory.getObject("userDao");

    @Override
    public void register(String username, String password, String phone, String address) throws RequestParameterErrorException, UserExistException {
        // 1.参数校验:非空校验、正则表达式等
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password) || ParameterUtil.isNull(phone) || ParameterUtil.isNull(address)) {
            throw new RequestParameterErrorException("请求参数有误");
        }

        // 2.业务校验:与业务相关的校验操作
        // 例如:用户名不能重复
        // 根据传递过来的用户名调用持久层方法进入数据库查询
        User selectUser = userDao.selectByUsername(username);
        // 如果不为null,则说明查询到对应数据了,即表示数据库已经存在重名的用户了
        if (selectUser != null) {
            throw new UserExistException("此用户名太受欢迎,请更换一个");
        }

        // 3.注册的核心业务
        // 对密码使用MD5加密
        User user = new User(username, MD5Util.md5(password), phone, address);
        // 加密后调用持久层方法将对应的数据插入到数据库中
        userDao.insertUser(user);
    }
    @Override
    public User login(String username, String password) throws RequestParameterErrorException, ObjectNotFoundException {
        // 1.参数校验
        if (ParameterUtil.isNull(username) || ParameterUtil.isNull(password)) {
            throw new RequestParameterErrorException("用户名或密码不能为空");
        }
        // 2.查询用户是否存在
        User user = userDao.selectByUsername(username);
        if (user == null) {
            throw new ObjectNotFoundException("用户名不存在");
        }
        // 3.验证密码
        if (!user.getPassword().equals(MD5Util.md5(password))) {
            throw new RequestParameterErrorException("密码错误");
        }
        return user;
    }

    @Override
    public User login(String username, String password, String code, String image) throws RequestParameterErrorException, CodeErrorException, UsernameNotExistException {
        if(ParameterUtil.isNull(username)||ParameterUtil.isNull(password)||ParameterUtil.isNull(image)||ParameterUtil.isNull(code)){
            throw new RequestParameterErrorException("请求参数有误");
        }
        if(!code.equals(image)){
            throw new CodeErrorException("验证码不正确");
        }
//        调用dao层方法
        User user=userDao.selectByUsernameAndPassword(username,MD5Util.md5(password));
        if(user==null){
            throw new UsernameNotExistException("用户名或密码错误");
        }
        return user;
    }

    @Override
    public void updatePassword(Integer userId, String oldPassword, String newPassword) throws RequestParameterErrorException, PasswordErrorException {
        //参数校验
        if (userId == null || ParameterUtil.isNull(oldPassword) || ParameterUtil.isNull(newPassword)) {
            throw new RequestParameterErrorException("用户ID、旧密码、新密码不能为空");
        }
        //查询用户
        User user = userDao.selectById(userId);
        // 旧密码校验（加密后对比，与数据库存储一致）
        if (!user.getPassword().equals(MD5Util.md5(oldPassword))) {
            throw new PasswordErrorException("旧密码输入错误");
        }
        //加密新密码并更新
        user.setPassword(MD5Util.md5(newPassword));
        userDao.updatePassword(user);
    }


}